package com.baizhiedu.cglib;

import com.baizhiedu.proxy.User;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 功能：
 * 作者：HZj
 * 日期：2024/12/26 23:17
 */
public class TestCgib{
    public static void main(String[] args) {
        /*
         *   Cglib创建动态代理对象的原理：父子继承关系创建代理对象，原始类作为弗雷，代理类作为子类，这样既可以保证2者方法一致，同时在代理类中提供新的实现(额外功能+原始方法)
         */
        //1.创建原始对象
        UserService userService = new UserService();

        /*
            2.通过cglib方式创建动态代理对象
                Proxy.newProxyInstance(classloader,interfaces,invocationHandler)

                Enhancer.setClassLoader()
                Enhancer.setSuperClass()
                Enhancer.setCallback();     --->    MethodInterceptor(cgliab)
                Enhancer.create() ---> 代理
        */
        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(TestCgib.class.getClassLoader());
        enhancer.setSuperclass(userService.getClass());
        MethodInterceptor methodInterceptor = new MethodInterceptor() {
            //等同于 InvocationHandler --- invoke
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("----cglib log----");
                Object ret = method.invoke(userService, args);

                return ret;
            }
        };
        enhancer.setCallback(methodInterceptor);
        UserService userServiceProxy = (UserService) enhancer.create();
        userServiceProxy.login("suns","123456");
        userServiceProxy.register(new User());
    }

    /**
     * 总结：
     *  1.JDK动态代理       Proxy.newProxyInstance()    通过接口创建代理的实现类
     *  2.Cglib动态代理     Enhancer.create()           通过继承父类创建的代理类
     *
     *
     * */
}
